home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / xvmahjon.por / xvmahjon / xvmahjongg / sunview / event.c < prev    next >
C/C++ Source or Header  |  1988-07-27  |  17KB  |  636 lines

  1. /*
  2.  *    Copyright 1988, Mark Holm
  3.  *            Exceptions
  4.  *
  5.  *    Acknowledgments to Dorothy Robinson for her artistic
  6.  *     abilities in drawing the icons and to Jim Batch for
  7.  *     technical support and graphical concepts (which I abandoned in favor
  8.  *       of the easy way out).
  9.  *
  10.  *    Permission is given to copy and distribute for non-profit purposes.
  11.  *
  12.  */
  13. #ifndef lint
  14. static char *rcs = "$header$ Copyright 1988 Mark A. Holm";
  15. #endif !lint
  16.  
  17. /*      This file has the event handlers for the background and
  18.  *       tiles in the play panel
  19.  */
  20.  
  21. #include <stdio.h>
  22. #include <sys/types.h>
  23. #include <suntool/sunview.h>
  24. #include <suntool/panel.h>
  25. #include <sunwindow/notify.h>
  26. #include <pixrect/pixrect.h>
  27.  
  28. #include "mahjongg.h"
  29.  
  30. /* external definitions */
  31.  
  32. extern Frame        main_frame;
  33. extern Panel        play_panel, message_panel;
  34. extern Panel_item    TL_hundred;
  35. extern Panel_item    TL_ten;
  36. extern Panel_item    TL_one;
  37. extern Panel_item    message;
  38. extern Panel_item    tile[144];
  39. extern Panel_item    tiles_left[3];
  40. extern Panel_item    board_num;
  41. extern Cursor        play_cursor;
  42.  
  43. extern boolean        BandW;
  44. extern Tiles        *board[144];
  45. extern int        tile_count;
  46. extern int        seed;
  47. extern Selected        selected[2];
  48.  
  49. /* local globals */
  50.  
  51. Selected        undo_tiles[144][2];
  52. int            undo_count;
  53. boolean            help_mode = FALSE;
  54. boolean            query_mode = FALSE;
  55.  
  56. /*******************************************/
  57.  
  58. void panel_msg(string, cursor_image)
  59. char        *string;
  60. Pixrect        *cursor_image;
  61.  
  62. {
  63.     static char    *old_string = (char *)0;
  64.  
  65.     if (string) {
  66.  
  67.     if (old_string)
  68.         panel_set(message,PANEL_SHOW_ITEM, FALSE, 0);
  69.  
  70.     panel_set(message, PANEL_LABEL_STRING,
  71.           string, PANEL_SHOW_ITEM, TRUE, 0);
  72.  
  73.     window_set(message_panel, WIN_IGNORE_PICK_EVENTS,
  74.                     WIN_MOUSE_BUTTONS, 0, 0);
  75.     window_set(message_panel, WIN_IGNORE_KBD_EVENT,
  76.                     WIN_ASCII_EVENTS, 0, 0);
  77.     cursor_set(play_cursor, CURSOR_IMAGE, cursor_image, 0);
  78.     window_set(play_panel, WIN_CURSOR, play_cursor, 0);
  79.  
  80.     } else {
  81.  
  82.     panel_set(message,PANEL_SHOW_ITEM, FALSE, 0);
  83.     window_set(message_panel, WIN_CONSUME_PICK_EVENTS,
  84.                     WIN_MOUSE_BUTTONS, 0, 0);
  85.     window_set(message_panel, WIN_CONSUME_KBD_EVENT,
  86.                     WIN_ASCII_EVENTS, 0, 0);
  87.     cursor_set(play_cursor, CURSOR_IMAGE, cursor_image, 0);
  88.     window_set(play_panel, WIN_CURSOR, play_cursor, 0);
  89.  
  90.     }
  91.  
  92.     old_string = string;
  93.  
  94. }
  95.  
  96. void help_proc(item, event)
  97. Panel_item    item;
  98. Event        *event;
  99.  
  100. {
  101.     int         i;
  102.     Tiles         *data[2];
  103.     static int    parse[2] = { 0, 0 };
  104.  
  105.     if(!(selected[0].filled))
  106.     {
  107.     if(!(help_mode)) { /* Just starting. init and recall */
  108.  
  109.         help_mode = TRUE;
  110.         parse[0] = 143;
  111.         parse[1] = 142;
  112.  
  113.     }
  114.  
  115.     for(; parse[0] >= 0; parse[0]--)
  116.     {
  117.         if (!((board[parse[0]]->top_free &&            /* uncovered */
  118.         (board[parse[0]]->left_free || board[parse[0]]->right_free) && /* open */
  119.         (!(board[parse[0]]->removed))))) {  /* not already used */
  120.  
  121.         continue; /* not available go to next */
  122.  
  123.         }
  124.  
  125.         for(; parse[1] >= 0; parse[1]--) { /* check for second tile */
  126.  
  127.         if ((board[parse[0]]->value == board[parse[1]]->value) &&    /* right value */
  128.             (parse[0] != parse[1]) &&                    /* different item */
  129.             (board[parse[1]]->top_free &&                /* uncovered */
  130.             (board[parse[1]]->left_free || board[parse[1]]->right_free) && /* open */
  131.             (!(board[parse[1]]->removed)))) { /* not already used */
  132.  
  133.             /* Found a match, show it */
  134.  
  135.             /* flag found items */
  136.             selected[0].filled = TRUE;
  137.             selected[1].filled = TRUE;
  138.  
  139.             /* fake in some data */
  140.             selected[0].item = tile[parse[0]];
  141.             selected[0].event.ie_locx = ((int) panel_get(tile[parse[0]], PANEL_ITEM_X) + 10);
  142.             selected[0].event.ie_locy = ((int) panel_get(tile[parse[0]], PANEL_ITEM_Y) + 10);
  143.             selected[0].event.ie_time.tv_sec = event->ie_time.tv_sec;
  144.             selected[0].event.ie_time.tv_usec = event->ie_time.tv_usec;
  145.  
  146.             selected[1].item = tile[parse[1]];
  147.             selected[1].event.ie_locx = ((int) panel_get(tile[parse[1]], PANEL_ITEM_X) + 10);
  148.             selected[1].event.ie_locy = ((int) panel_get(tile[parse[1]], PANEL_ITEM_Y) + 10);
  149.             selected[1].event.ie_time.tv_sec = event->ie_time.tv_sec;
  150.             selected[1].event.ie_time.tv_usec = event->ie_time.tv_usec;
  151.  
  152.             /* Muppet news flash */
  153.             panel_begin_preview(selected[0].item, selected[0].event);
  154.             panel_begin_preview(selected[1].item, selected[1].event);
  155.  
  156.             panel_msg("Show next move? [Y] [] [N]", &confirm);
  157.  
  158.             parse[1]--; /* do loop step */
  159.             return; /* all done this rotation */
  160.  
  161.         }
  162.  
  163.         } /* else go to next */
  164.  
  165.         parse[1] = parse[0] - 2; /* going around again */
  166.  
  167.     }
  168.  
  169.     /* no more moves beep and show message */
  170.  
  171.     help_mode = FALSE;
  172.     window_bell(main_frame);
  173.     panel_msg((char *)0, &stick);
  174.  
  175.     } else { /* search for available match */
  176.  
  177.     if (selected[1].filled) { /* deselect last choice */
  178.  
  179.         /* cancel preview of selected tiles */
  180.         panel_cancel_preview(selected[1].item, selected[1].event);
  181.         /* Clean up selected's variables */
  182.         selected[1].filled = FALSE;
  183.  
  184.     }
  185.  
  186.     if (!query_mode) {
  187.  
  188.         query_mode = TRUE;
  189.         parse[0] = 143;
  190.  
  191.     }
  192.  
  193.     data[0] = (Tiles *) panel_get(selected[0].item, PANEL_CLIENT_DATA);
  194.  
  195.     for(i = parse[0]; i >= 0; i--) {
  196.  
  197.         if ((board[i]->value == data[0]->value) && /* right value */
  198.         (tile[i] != selected[0].item) &&    /* different item */
  199.         (board[i]->top_free &&            /* uncovered */
  200.         (board[i]->left_free || board[i]->right_free) && /* open */
  201.         (!(board[i]->removed)))) { /* not already used */
  202.  
  203.         /* found one */
  204.  
  205.         /* fake in some selected data */
  206.  
  207.         selected[1].item = tile[i];
  208.         selected[1].event.ie_locx = ((int) panel_get(tile[i], PANEL_ITEM_X) + 10);
  209.         selected[1].event.ie_locy = ((int) panel_get(tile[i], PANEL_ITEM_Y) + 10);
  210.         selected[1].event.ie_time.tv_sec = 10; /*sounds good */
  211.         selected[1].event.ie_time.tv_usec = 10; /*sounds good */
  212.  
  213.         selected[1].filled = TRUE;
  214.  
  215.         /* turn on preview */
  216.  
  217.         panel_begin_preview(selected[1].item, selected[1].event);
  218.  
  219.         /* set confirm message */
  220.  
  221.         panel_msg("Please confirm. [Y] [NEXT] [N]", &confirm);
  222.  
  223.         /* return to sender */
  224.  
  225.         parse[0] = i - 1;
  226.         return;
  227.  
  228.         }
  229.     }
  230.  
  231.     query_mode = FALSE;
  232.     selected[0].filled = FALSE;
  233.     panel_cancel_preview(selected[0].item, selected[0].event);
  234.     panel_msg((char *)0, &stick);
  235.     window_bell(main_frame);
  236.  
  237.     }
  238. }
  239.  
  240. void remove_tiles(REMOVE)
  241. boolean    REMOVE;
  242.  
  243. {
  244. Tiles    *data[2];
  245. int     i;
  246. int     tiles_left_hun;
  247. int     tiles_left_ten;
  248. int     tiles_left_one;
  249. Pixwin  *pw;
  250. Rect    *r;
  251.  
  252.     if (REMOVE) {
  253.     /* get data from items to be removed */
  254.     data[0] = (Tiles *) panel_get(selected[0].item, PANEL_CLIENT_DATA);
  255.     data[1] = (Tiles *) panel_get(selected[1].item, PANEL_CLIENT_DATA);
  256.  
  257.     } else {
  258.     /* get data from items to be replaced */
  259.     data[0] = (Tiles *) panel_get(undo_tiles[undo_count][0].item, PANEL_CLIENT_DATA);
  260.     data[1] = (Tiles *) panel_get(undo_tiles[undo_count][1].item, PANEL_CLIENT_DATA);
  261.     }
  262.  
  263.     /* adjust adjacent tiles */
  264.     for(i = 0; i < 2 && data[0]->left_next[i] != 999; board[data[0]->left_next[i]]->right_free = REMOVE, i++);
  265.     for(i = 0; i < 2 && data[1]->left_next[i] != 999; board[data[1]->left_next[i]]->right_free = REMOVE, i++);
  266.     for(i = 0; i < 2 && data[0]->right_next[i] != 999; board[data[0]->right_next[i]]->left_free = REMOVE, i++);
  267.     for(i = 0; i < 2 && data[1]->right_next[i] != 999; board[data[1]->right_next[i]]->left_free = REMOVE, i++);
  268.  
  269.     /* adjust covered tiles and images */
  270.     for(i = 0; i < 4 && data[0]->covered[i] != 999; board[data[0]->covered[i]]->top_free = REMOVE, i++)
  271.     panel_set(tile[data[0]->covered[i]], PANEL_LABEL_IMAGE, (REMOVE || data[0]->covered[i] >= 139) ? board[data[0]->covered[i]]->image : (BandW) ? &BLANK : &cBLANK, 0);
  272.     for(i = 0; i < 4 && data[1]->covered[i] != 999; board[data[1]->covered[i]]->top_free = REMOVE, i++) 
  273.     panel_set(tile[data[1]->covered[i]], PANEL_LABEL_IMAGE, (REMOVE || data[1]->covered[i] >= 139) ? board[data[1]->covered[i]]->image : (BandW) ? &BLANK : &cBLANK, 0);
  274.  
  275.     /* set removed flags */
  276.     data[0]->removed = REMOVE;
  277.     data[1]->removed = REMOVE;
  278.  
  279.     if (REMOVE) {
  280.     /* turn off preview */
  281.     panel_cancel_preview(selected[0].item, selected[0].event);
  282.     panel_cancel_preview(selected[1].item, selected[1].event);
  283.     } else  /* check to see if previewing an item and un-preview and select */
  284.     if (selected[0].filled) {
  285.         panel_cancel_preview(selected[0].item, selected[0].event);
  286.         selected[0].filled = FALSE;
  287.     }
  288.  
  289.     /* fix playing field */
  290.     panel_paint(play_panel, PANEL_NONE);
  291.     panel_set((REMOVE) ? selected[0].item : undo_tiles[undo_count][0].item, PANEL_SHOW_ITEM, !REMOVE, 0);
  292.     panel_set((REMOVE) ? selected[1].item : undo_tiles[undo_count][1].item, PANEL_SHOW_ITEM, !REMOVE, 0);
  293.     panel_paint(play_panel, PANEL_NO_CLEAR);
  294.  
  295.     /* deselect tiles */
  296.     selected[0].filled = FALSE;
  297.     selected[1].filled = FALSE;
  298.  
  299.     /* fix tile counter */
  300.     tile_count += (REMOVE) ? -2 : 2;
  301.  
  302.     tiles_left_hun = tile_count / 100;
  303.     tiles_left_ten = (tile_count - (tiles_left_hun * 100)) / 10;
  304.     tiles_left_one = tile_count - (tiles_left_hun * 100) - (tiles_left_ten * 10);
  305.  
  306.     /* display hundreds tile by own status */
  307.     panel_set(TL_hundred, PANEL_SHOW_ITEM, tiles_left_hun, 0);
  308.  
  309.     /* display tens tile by own status ored with hundreds status */
  310.     panel_set(TL_ten, PANEL_SHOW_ITEM, tiles_left_hun || tiles_left_ten, 0);
  311.  
  312.     switch(tiles_left_ten) {
  313.     case 0:
  314.         panel_set(TL_ten, PANEL_LABEL_IMAGE, (BandW) ? &NUM0 : &cNUM0, 0);
  315.         break;
  316.     case 1:
  317.         panel_set(TL_ten, PANEL_LABEL_IMAGE, (BandW) ? &NUM1 : &cNUM1, 0);
  318.         break;
  319.     case 2:
  320.         panel_set(TL_ten, PANEL_LABEL_IMAGE, (BandW) ? &NUM2 : &cNUM2, 0);
  321.         break;
  322.     case 3:
  323.         panel_set(TL_ten, PANEL_LABEL_IMAGE, (BandW) ? &NUM3 : &cNUM3, 0);
  324.         break;
  325.     case 4:
  326.         panel_set(TL_ten, PANEL_LABEL_IMAGE, (BandW) ? &NUM4 : &cNUM4, 0);
  327.         break;
  328.     case 5:
  329.         panel_set(TL_ten, PANEL_LABEL_IMAGE, (BandW) ? &NUM5 : &cNUM5, 0);
  330.         break;
  331.     case 6:
  332.         panel_set(TL_ten, PANEL_LABEL_IMAGE, (BandW) ? &NUM6 : &cNUM6, 0);
  333.         break;
  334.     case 7:
  335.         panel_set(TL_ten, PANEL_LABEL_IMAGE, (BandW) ? &NUM7 : &cNUM7, 0);
  336.         break;
  337.     case 8:
  338.         panel_set(TL_ten, PANEL_LABEL_IMAGE, (BandW) ? &NUM8 : &cNUM8, 0);
  339.         break;
  340.     case 9:
  341.         panel_set(TL_ten, PANEL_LABEL_IMAGE, (BandW) ? &NUM9 : &cNUM9, 0);
  342.         break;
  343.     }
  344.  
  345.     switch(tiles_left_one) { /* only need even tiles */
  346.     case 0:
  347.         panel_set(TL_one, PANEL_LABEL_IMAGE, (BandW) ? &NUM0 : &cNUM0, 0);
  348.         break;
  349.     case 2:
  350.         panel_set(TL_one, PANEL_LABEL_IMAGE, (BandW) ? &NUM2 : &cNUM2, 0);
  351.         break;
  352.     case 4:
  353.         panel_set(TL_one, PANEL_LABEL_IMAGE, (BandW) ? &NUM4 : &cNUM4, 0);
  354.         break;
  355.     case 6:
  356.         panel_set(TL_one, PANEL_LABEL_IMAGE, (BandW) ? &NUM6 : &cNUM6, 0);
  357.         break;
  358.     case 8:
  359.         panel_set(TL_one, PANEL_LABEL_IMAGE, (BandW) ? &NUM8 : &cNUM8, 0);
  360.         break;
  361.     }
  362.  
  363.     if (REMOVE) {
  364.  
  365.     /* update undo_count */
  366.     undo_count++;
  367.  
  368.     /* update removed array */
  369.     undo_tiles[undo_count][0].item = selected[0].item;
  370.     undo_tiles[undo_count][0].event.ie_locx = selected[0].event.ie_locx;
  371.     undo_tiles[undo_count][0].event.ie_locy = selected[0].event.ie_locy;
  372.     undo_tiles[undo_count][0].event.ie_time.tv_sec = selected[0].event.ie_time.tv_sec;
  373.     undo_tiles[undo_count][0].event.ie_time.tv_usec = selected[0].event.ie_time.tv_usec;
  374.     undo_tiles[undo_count][0].filled = TRUE;
  375.  
  376.     undo_tiles[undo_count][1].item = selected[1].item;
  377.     undo_tiles[undo_count][1].event.ie_locx = selected[1].event.ie_locx;
  378.     undo_tiles[undo_count][1].event.ie_locy = selected[1].event.ie_locy;
  379.     undo_tiles[undo_count][1].event.ie_time.tv_sec = selected[1].event.ie_time.tv_sec;
  380.     undo_tiles[undo_count][1].event.ie_time.tv_usec = selected[1].event.ie_time.tv_usec;
  381.     undo_tiles[undo_count][1].filled = TRUE;
  382.  
  383.     /* remove confirm message */
  384.  
  385.     panel_msg((char *)0, &stick);
  386.  
  387.     /* check for clean board and congrat them */
  388.  
  389.     if ( tiles_left_hun == 0 && tiles_left_ten == 0 && tiles_left_one == 0) 
  390.         panel_set(message, PANEL_LABEL_STRING,
  391.                 "Congratulations!! Press 'AGAIN' or 'NEW'",
  392.                PANEL_SHOW_ITEM,
  393.                 TRUE, 0);
  394.  
  395.     } else { /* decrement undo_count */
  396.     undo_tiles[undo_count][0].filled = FALSE;
  397.     undo_tiles[undo_count][1].filled = FALSE;
  398.     undo_count--;
  399.     }
  400. }
  401.  
  402. void play_back_proc(where, event)
  403. Panel         where;
  404. Event        *event;
  405. {
  406.     if (!event_is_down(event))
  407.     return;
  408.  
  409.     if ((event_id(event) == MS_MIDDLE) && selected[0].filled && !help_mode) {
  410.  
  411.     help_proc();
  412.  
  413.     } else {
  414.  
  415.     query_mode = FALSE;
  416.  
  417.     if (selected[1].filled) { /* doing confirm  or next help */
  418.  
  419.         switch (event_id(event)) {
  420.  
  421.         case MS_LEFT:
  422.         /* confirmed selection */
  423.         if (help_mode) { /* do next help */
  424.  
  425.             /* cancel preview of selected tiles */
  426.             panel_cancel_preview(selected[0].item, selected[0].event);
  427.             panel_cancel_preview(selected[1].item, selected[1].event);
  428.             /* Clean up selected's variables */
  429.             selected[0].filled = FALSE;
  430.             selected[1].filled = FALSE;
  431.  
  432.             /* do next help */
  433.             help_proc(selected[0].item, event);
  434.  
  435.         } else { /* confirmed selection. remove them */
  436.  
  437.             remove_tiles(TRUE);
  438.  
  439.         }
  440.         break;
  441.  
  442.         case MS_RIGHT:
  443.         /* refused selection */
  444.  
  445.         /* cancel preview of selected tiles */
  446.         panel_cancel_preview(selected[0].item, selected[0].event);
  447.         panel_cancel_preview(selected[1].item, selected[1].event);
  448.         /* Clean up selected's variables */
  449.         selected[0].filled = FALSE;
  450.         selected[1].filled = FALSE;
  451.  
  452.         /* remove confirm message */
  453.  
  454.         panel_msg((char *)0, &stick);
  455.  
  456.         /* if in help mode toggle out */
  457.         if (help_mode)
  458.             help_mode = FALSE; 
  459.  
  460.         break;
  461.  
  462.         }
  463.     }
  464.     }
  465. }
  466.  
  467. void play_event_proc(item, event)
  468. Panel_item         item;
  469. Event            *event;
  470.  
  471. {
  472.     Tiles    *data;
  473.     int    value;
  474.     int    i;
  475.     int    x;
  476.     int    y;
  477.  
  478.     if (!event_is_down(event))
  479.     return;
  480.  
  481.     /* check to see if in help_mode */
  482.  
  483.     if (help_mode || query_mode) {
  484.     play_back_proc(play_panel, event);
  485.     return;
  486.     }
  487.  
  488.     /* check to see if just confirming */
  489.  
  490.     if (selected[1].filled) {
  491.     play_back_proc(play_panel, event);
  492.     return;
  493.     }
  494.  
  495.     /* translate item to top level available */
  496.  
  497.     if ((event_id(event) == MS_LEFT) &&
  498.     ((ROW2 - B_TILE_SHADOW) <= event->ie_locy) &&
  499.     (event->ie_locy <= (ROW2 - B_TILE_SHADOW + (6 * W_BASE_TILE))) &&
  500.     ((COL5 - S_TILE_SHADOW) <= event->ie_locx) &&
  501.     (event->ie_locx <= (COL5 - S_TILE_SHADOW + (6 * H_BASE_TILE))) ) { /* in overlap area, check for stacks */
  502.  
  503.     for(i = 143; i > 86 ; i--) { /* check from top to bottom */
  504.  
  505.         x = (int) panel_get(tile[i], PANEL_ITEM_X);
  506.         y = (int) panel_get(tile[i], PANEL_ITEM_Y);
  507.  
  508.         if ((x <= event->ie_locx) &&
  509.         (event->ie_locx <= x + W_BASE_TILE) &&
  510.         (y <= event->ie_locy) &&
  511.         (event->ie_locy <= y + H_BASE_TILE)) { /* right spot */
  512.  
  513.         if ( !(board[i]->removed) ) {
  514.  
  515.             item = tile[i]; /* got it */
  516.             break;
  517.  
  518.         } else if (i != 143) {   /* look on next layer down */
  519.                      /* take first covered tile and add 1 for loop */
  520.              i = board[i]->covered[0] + 1;
  521.         }
  522.  
  523.         } /* wrong location. try again */
  524.  
  525.     } /* next loop */
  526.  
  527.     }
  528.  
  529.     /* get data from item selected */
  530.  
  531.     data = (Tiles *) panel_get(item, PANEL_CLIENT_DATA);
  532.     value = data->value;
  533.  
  534.     switch(event_id(event)) {
  535.  
  536.     case MS_LEFT: 
  537.     /* Left button down begin selection */
  538.     if ( data->top_free && (data->left_free || data->right_free)) {
  539.  
  540.         if (!(selected[0].filled)) {
  541.  
  542.         /* fill first selection if empty */
  543.         selected[0].item = item;
  544.         selected[0].event.ie_locx = event->ie_locx;
  545.         selected[0].event.ie_locy = event->ie_locy;
  546.         selected[0].event.ie_time.tv_sec = event->ie_time.tv_sec;
  547.         selected[0].event.ie_time.tv_usec = event->ie_time.tv_usec;
  548.  
  549.         selected[0].filled = TRUE;
  550.         panel_begin_preview(selected[0].item, selected[0].event);
  551.  
  552.         } else {
  553.  
  554.         if (item == selected[0].item) { /* deselect item */
  555.  
  556.             selected[0].filled = FALSE;
  557.             panel_cancel_preview(selected[0].item, selected[0].event);
  558.  
  559.         } else {
  560.             data = (Tiles *) panel_get(selected[0].item, PANEL_CLIENT_DATA);
  561.             if ( value == data->value) {
  562.             /* fill second and show confirm message */
  563.  
  564.             selected[1].item = item;
  565.             selected[1].event.ie_locx = event->ie_locx;
  566.             selected[1].event.ie_locy = event->ie_locy;
  567.             selected[1].event.ie_time.tv_sec = event->ie_time.tv_sec;
  568.             selected[1].event.ie_time.tv_usec = event->ie_time.tv_usec;
  569.  
  570.             selected[1].filled = TRUE;
  571.             panel_begin_preview(selected[1].item, selected[1].event);
  572.  
  573.             panel_msg("Please confirm. [Y] [] [N]", &confirm);
  574.  
  575.             } else { /* beep at them */
  576.  
  577.             window_bell(main_frame);
  578.  
  579.             }
  580.         }
  581.         }
  582.  
  583.     } else { /* beep at them */
  584.  
  585.         window_bell(main_frame);
  586.  
  587.     }
  588.     break;
  589.  
  590.     case MS_MIDDLE:
  591.     if (selected[0].filled) { /* request for help */
  592.  
  593.         help_proc();
  594.  
  595.     }
  596.     break;
  597.  
  598.     /* and all else shall pass */
  599.     }
  600. }
  601.  
  602. void quit_proc()
  603. {
  604.     window_destroy(main_frame);
  605. }
  606.  
  607. void new_proc()
  608. {
  609.  
  610.     seed = random() % 20011;
  611.     build_image(FALSE);
  612.     place_tiles(FALSE);
  613. }
  614.  
  615. void again_proc()
  616. {
  617.     build_image(TRUE);
  618.     place_tiles(FALSE);
  619. }
  620.  
  621. void undo_proc()
  622.  
  623. {
  624.     if(undo_count < 0)
  625.     window_bell(main_frame);
  626.     else
  627.     remove_tiles(FALSE);
  628. }
  629.  
  630. void board_num_proc()
  631. {
  632.     sscanf((char *) panel_get(board_num, PANEL_VALUE), "%d", &seed);
  633.     build_image(FALSE);
  634.     place_tiles(FALSE);
  635. }
  636.